# 实现去除<>以及中括号内的内容
import re
from typing import Union, List, Any

def extract_clean_text(input_data: Union[str, List, Any]) -> str:
    """
    从包含XML标签和时间戳的文本中提取纯文本内容，支持多种输入类型
    
    参数:
        input_data: 输入数据，可以是字符串、列表或其他类型
                   str示例: '<zh><SICHUAN><asr><0.00> 哎呀,桂花超级漂亮的。<2.98>'
                   list示例: ['<tag>文本1', '<tag>文本2']
    
    返回:
        str: 纯文本内容，如 '哎呀,桂花超级漂亮的。' 或 '文本1 文本2'
    """
    # 处理非字符串输入
    if not isinstance(input_data, str):
        if isinstance(input_data, list):
            # 如果是列表，递归处理每个元素后拼接
            return ' '.join(extract_clean_text(item) for item in input_data)
        else:
            # 其他类型直接转为字符串
            input_data = str(input_data)
    
    # 使用正则表达式移除所有< >标签及其内容
    clean_text = re.sub(r'<[^>]+>', '', input_data)
    
    # 中文标点处理
    clean_text = chinese_marks_punctuation_replace(clean_text)
    
    return clean_text

def test_extract_clean_text():
    # 测试用例
    test_cases=' < zh > < CN > < asr > < 0. 00 >你好。< 3. 64 >.'
    # test_cases = [
    #     ' < zh > < CN > < asr > < 0. 00 >你好。< 3. 64 >.'
    #     ['<tag>文本1', '<tag>文本2'],
    #     '这是一个测试文本，包含<html>标签和 [列表] 内容。'
    # ]
    test_cases=extract_clean_text(test_cases)
    print(test_cases)

def remove_brackets_and_content(text, brackets="<>[]"):
    """
    去除文本中指定括号及其内容
    
    Args:
        text (str): 输入文本
        brackets (str): 要处理的括号类型，默认为 "<>[]"
    
    Returns:
        str: 处理后的文本
    调用：# 测试
    text = "这是一个测试文本，包含<html>标签和 [列表] 内容。"
    processed_text = remove_brackets_and_content(text)
    print(processed_text)
    """
    if not text:
        return text
    
    # 处理 < > 及其内容
    if '<' in brackets and '>' in brackets:
        text = re.sub(r'<.*?>', '', text)
    
    # 处理 [ ] 及其内容
    if '[' in brackets and ']' in brackets:
        text = re.sub(r'\[.*?\]', '', text)
    text=text.strip()
    return text


def contains_chinese(text, min_ratio=0.3):
    """中文字符占比判断"""
    chinese_chars = re.findall(r'[\u4e00-\u9fa5]', text)
    total_chars = len(text)
    if total_chars == 0:
        return False
    chinese_ratio = len(chinese_chars) / total_chars
    return chinese_ratio >= min_ratio  # 中文占比≥min_ratio%才返回True

def chinese_marks_punctuation_replace(text, min_ratio=0.3):
    """功能：对文本末尾的标点进行智能替换（仅当中文占比大于min_ratio时生效）。
    替换规则：
    单标点 → 转换为对应的中文标点（如 . → 。、? → ？）。
    重复标点 → 按优先级选择最合适的标点（！ ？ 。 > ； > ， 、 ：）。
    非中文文本（中文占比小于min_ratio） → 不进行任何替换。
    举例：
    原句: 今天天气真好……适合出去散步。 => 替换后: 今天天气真好……适合出去散步。
    原句:     你好，. => 替换后: 你好。
    原句: 嗯。. => 替换后: 嗯。
    原句: 你好，。. => 替换后: 你好。
    原句: 你好，你在哪儿. => 替换后: 你好，你在哪儿。
    原句: Hello, how are you? => 替换后: Hello, how are you?
    原句: This is 50%中文. => 替换后: This is 50%中文.
    原句: 你好！你在哪儿？？ => 替换后: 你好！你在哪儿？
    原句: Test. => 替换后: Test.
    原句: 80%都是中文！！ => 替换后: 80%都是中文！
    """
    # 去除首尾空白字符
    text=text.strip()
    # 如果中文占比<60%，直接返回原文本
    if not contains_chinese(text):
        return text
    
    # 英文标点 -> 中文标点映射
    en_to_zh_punct = {
        '.': '。',
        '?': '？',
        '!': '！',
        ';': '；',
        ',': '，',
        ':': '：'
    }
    
    # 优先级组（从高到低）
    priority_groups = [
        ['。', '？', '！'],  # 最高优先级
        ['；'],             # 中等优先级
        ['，', '、', '：']   # 最低优先级
    ]
    
    # 匹配末尾的标点（中文或英文，至少1个）
    match = re.search(r'([.?!;,:。？！；，、：]+)$', text)
    if not match:
        return text  # 无标点，直接返回
    
    original_puncts = match.group(1)
    
    # 1. 先转换英文标点为中文标点
    converted_puncts = []
    for p in original_puncts:
        converted_puncts.append(en_to_zh_punct.get(p, p))  # 如果是英文标点则转换，否则保留
    
    # 2. 如果只有一个标点，直接替换
    if len(converted_puncts) == 1:
        new_text = text[:match.start()] + converted_puncts[0]
        return new_text
    
    # 3. 如果是重复标点，按优先级选择最合适的
    replacement = None
    for group in priority_groups:
        for p in converted_puncts:
            if p in group:
                replacement = p
                break
        if replacement is not None:
            break
    
    # 如果没有匹配任何优先级组（理论上不会发生）
    if replacement is None:
        replacement = converted_puncts[-1]
    
    # 替换末尾标点
    new_text = text[:match.start()] + replacement
    return new_text

def text_rm_brack_chinese_marks_punctuation_replace(text):
    """功能：去除<>括号内容以及中文标点替换；"""
    text=remove_brackets_and_content(text)
    text=chinese_marks_punctuation_replace(text)
    return text

def test_text_rm_brack_chinese_marks_punctuation_replace():
    """->支持多种语言包括中文、英语、日语、韩语、法语、德语、西班牙语、亚拉伯语等七十四种语言。"""
    # text="< | yue | > < | NEUTRAL | > < | S pe ech | > < | withi tn | >支持多种语言包括中文、英语、日语、韩语、法语、德语、西班牙语、亚拉伯语等七十四种语言。。"
    text="what are you ..."
    text=text_rm_brack_chinese_marks_punctuation_replace(text)
    print(text)

def test_brackets_and_content():
    """->支持多种语言包括中文、英语、日语、韩语、法语、德语、西班牙语、亚拉伯语等七十四种语言。"""
    text="what are you ..."
    text=remove_brackets_and_content(text)
    print(text)
    
def test_chinese_marks_punctuation_replace():
    # 测试用例
    test_cases = [
    "< | yue | > < | NEUTRAL | > < | S pe ech | > < | withi tn | >支持多种语言包括中文、英语、日语、韩语、法语、德语、西班牙语、亚拉伯语等七十四种语言。。",
    "今天天气真好……适合出去散步。",
    '    你好，.'   ,
    "嗯。.",
    "你好，。.",
    "你好，你在哪儿.",      # 中文占比高，替换 . → 。 => 你好，你在哪儿。
    "Hello, how are you?",  # 英文占比高，不替换 => Hello, how are you?
    "This is 50%中文.",     # 中文占比50%（<60%），不替换 => This is 50%中文.
    "你好！你在哪儿？？",    # 中文占比高，替换 ?? → ？ => 你好！你在哪儿？
    "Test.",               # 无中文，不替换 => Test.
    "80%都是中文！！",      # 中文占比高，替换 !! → ！ => 80%都是中文！
    ]

    for test in test_cases:
        print(f"原句: {test} => 替换后: {chinese_marks_punctuation_replace(test)}")

if __name__ == "__main__":
    # test_chinese_marks_punctuation_replace()
    # test_extract_clean_text()
    # test_brackets_and_content()
    test_text_rm_brack_chinese_marks_punctuation_replace()
